package cn.jly.bigdata.spark.core

import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.rdd.RDD

/**
 * 测试RDD缓存
 *
 * @author lanyangji
 * @date 2019/11/27 21:08
 */
object Spark05_Cache {

  def main(args: Array[String]): Unit = {

    val sc = new SparkContext(new SparkConf().setMaster("local[*]").setAppName("test-cache"))

    // 测试缓存
    val arrayRdd: RDD[String] = sc.makeRDD(Array("tom"))

    val mapRDD: RDD[String] = arrayRdd.map(_.toString + System.currentTimeMillis)

    // 多次打印结果
    mapRDD.foreach(println)
    mapRDD.foreach(println)
    mapRDD.foreach(println)

    // 设置缓存
    // cache会将计算结果缓存，但是只是在遇到action算子的时候触发
    val cacheRdd: RDD[String] = arrayRdd.map(_.toString + System.currentTimeMillis).cache()

    cacheRdd.foreach(println)
    cacheRdd.foreach(println)
    cacheRdd.foreach(println)

    /*
    血缘关系--(12) MapPartitionsRDD[2] at map at Spark05_Cache.scala:30 [Memory Deserialized 1x Replicated]
    // 缓存提高效率
 |        CachedPartitions: 12; MemorySize: 272.0 B; ExternalBlockStoreSize: 0.0 B; DiskSize: 0.0 B
    // 之所以不舍弃缓存之前的血缘，是防止缓存失效，丢失数据
 |   ParallelCollectionRDD[0] at makeRDD at Spark05_Cache.scala:19 [Memory Deserialized 1x Replicated]

     */
    println("血缘关系--" + cacheRdd.toDebugString)

    println("----------")
    sc.stop()
  }
}
